//
// Description: 202. 快乐数
// Created by Loading on 2025/4/13.
//

#include <bits/stdc++.h>

using namespace std;

bool isHappy(int n) {
    /// 哈希
    unordered_set<int> hash;

    while (hash.find(n) == hash.end()) {
        hash.insert(n);
        int cnt = 0;
        while (n) {
            int tmp = n % 10;
            cnt += tmp * tmp;
            n /= 10;
        }
        if (cnt == 1) {
            return true;
        }
        n = cnt;
    }

    return false;

    /// 数学
//    unordered_set<int> cycle{4, 16, 37, 58, 89, 145, 42, 20}; // 循环内的数，只要命中其中任何一个，即进入循环中
//
//    while (n != 1 && cycle.find(n) == cycle.end()) {
//        int cnt = 0;
//        while (n) {
//            int tmp = n % 10;
//            cnt += tmp * tmp;
//            n /= 10;
//        }
//        n = cnt;
//    }
//
//    return n == 1;
}

int main() {
    int n = 19;

    auto res = isHappy(n);

    cout << res << endl;

    return 0;
}
